home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / pao / towns / cdplay / src / tape.c < prev    next >
Text File  |  1991-10-18  |  10KB  |  338 lines

  1. /* << High C V1.4 >> **********************************************************
  2. **
  3. **    CD PLAYER プログラム演奏モード時の録音可能テープ選択ルーチン
  4. **
  5. **    1991.03.26 : CREATE
  6. **    1991.03.27 : FINISH
  7. **
  8. **    < HISTORY >
  9. **    1991.03.26 : CREATE
  10. **
  11. **    < note > : TABS = 4
  12. **
  13. **    All Rights Reserved, Copyright (C) Y.Hirata 1991.
  14. **
  15. **    Programmed by Y.Hirata ( Nifty ID : NAB03321 )
  16. **
  17. ******************************************************************************/
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include "cdpn.h"
  23.  
  24. #define    _TAPE_MAIN
  25. #include "tape.h"
  26.  
  27. #define    DEF_TAPEFILE    "TAPE.DEF"            /*  TAPE情報格納ファイル名        */
  28. #define    TAPE_MAX_MINUTE    999
  29. #define    TAPE_MIX_MINUTE    1
  30.  
  31. CDDA_TRACK    Sidetime ;                /*  選択したテープの片面録音可能時間    */
  32.  
  33. /****************************  テープ情報初期設定  *****************************/
  34. int TAPE_define( void )
  35. /*=============================================================================
  36. **    テープの種類に関する情報を、定義ファイルから読み込んで設定する.
  37. **
  38. **    < INPUT  > : なし
  39. **    < OUTPUT > : なし
  40. **    < RETURN > : 設定できた時には、真値, できなかった時には、偽値.
  41. **
  42. **    ファイル中、セミコロン「;」以降はコメントである.
  43. =============================================================================*/
  44. {
  45.     FILE    *fp ;
  46.     char    buf[128] ;
  47.     char    *p ;
  48.     char    *q = ", \t" ;                    /*  コンマ,スペース,タブを区切りとする    */
  49.     int        ndata, data ;
  50.     char    flg ;
  51.  
  52.     if ( (fp=fopen( DEF_TAPEFILE,"r" )) == NULL ) {
  53.  
  54. /*    ↓↓                        ★★ DEBUG ★★                        ↓↓    */
  55.         if ( CDDA_DEBUG ) {
  56.             printf( "can't open input file : %s\n",DEF_TAPEFILE ) ;
  57.         }
  58. /*    ↑↑                        ★★ DEBUG ★★                        ↑↑    */
  59.  
  60.         return( FALSE ) ;
  61.     }
  62.  
  63.     ndata = ZERO ;
  64.     while ( (fgets( buf,128,fp )) != NULL ) {
  65.         p = strtok( buf,q ) ;
  66.         if ( p[0] != ';' ) {                    /*  コメント行以外                */
  67.             flg = FALSE ;
  68.             if ( p != NULL ) {                    /*  テープ時間チェック            */
  69.                 data = atoi( p ) ;
  70.                 if ( TAPE_MIX_MINUTE <= data && data <= TAPE_MAX_MINUTE ) {
  71.                     flg = TRUE ;
  72.                 }
  73.             }
  74.             if ( flg ) {
  75.                 Tape[ndata]     = data ;
  76.                 Tapeperm[ndata] = ZERO ;
  77.                 p = strtok( NULL,q ) ;
  78.                 if ( p == NULL ) {                /*  許容時間データなし        */
  79.                     ;
  80.                 } else if ( p[0] != ';' ) {        /*  コメント以外                */
  81.                     data = atoi( p ) ;
  82.                     Tapeperm[ndata] = data ;
  83.                 }
  84.                 ndata ++ ;
  85.             }
  86.         }
  87.     }
  88.     fclose( fp ) ;
  89.  
  90.     if ( ndata ) {                                /*  テープ情報あり            */
  91.         Ntape = ndata ;
  92.         return( TRUE ) ;
  93.     } else {                                    /*  テープ情報なし            */
  94.         return( FALSE ) ;
  95.     }
  96. }
  97.  
  98. /****************************  テープ情報初期設定  *****************************/
  99. void TAPE_init( void )
  100. /*=============================================================================
  101. **    テープの種類に関する情報の初期設定を行う.
  102. **
  103. **    < INPUT  > : なし
  104. **    < OUTPUT > : なし
  105. **    < RETURN > : なし
  106. =============================================================================*/
  107. {
  108.     int        defntape = 9 ;                        /*  テープの種類                */
  109.     char    deftape[]      = {                    /*  テープ時間[分]            */
  110.                             30, 42, 46, 54, 60, 74, 80, 90, 120
  111.                            } ;
  112.     char    deftapeperm[] = {                    /*  オーバー許容時間[秒](片面)    */
  113.                             20, 25, 30, 35, 40, 45, 50, 55, 60
  114.                            } ;
  115.     int        c ;
  116.  
  117.     if ( !TAPE_define() ) {                        /*  TAPE情報取得            */
  118.         /*  TAPE情報取得不可の時    */
  119.         Ntape = defntape ;
  120.         for ( c=0; c<defntape; c++ ) {
  121.             Tape[c]     = deftape[c] ;
  122.             Tapeperm[c] = deftapeperm[c] ;
  123.         }
  124.     }
  125.  
  126.     Tapetime = ZERO ;
  127.     Sidetime.min = Sidetime.sec = Sidetime.frame = ZERO ;
  128. }
  129.  
  130. /*******************************  テープ自動選択  ******************************/
  131. int TAPE_tapeselect( void )
  132. /*=============================================================================
  133. **    録音可能テープの選択を行う.
  134. **
  135. **    < INPUT  > : なし
  136. **    < OUTPUT > : なし
  137. **    < RETURN > : テープ選択できた時には、真値, できなければ、偽値.
  138. =============================================================================*/
  139. {
  140.     int        c, cmp ;
  141.  
  142.     if ( Playmode != SW_PROGRAM )
  143.         return( FALSE ) ;                        /*  プログラム演奏モードでない    */
  144.     if ( Flg.tape ) return( FALSE ) ;            /*  既にテープ選択済            */
  145.  
  146.     Tapetime = ZERO ;
  147.     Sidetime.min = Sidetime.sec = Sidetime.frame = ZERO ;
  148.     for ( c=0; c<Ntape; c++ ) {
  149.         cmp = CDDA_cmptime( Tape[c],Tapeperm[c]+Tapeperm[c],ZERO,
  150.                     CDDA_TIME_music.min,
  151.                     CDDA_TIME_music.sec,
  152.                     CDDA_TIME_music.frame ) ;
  153.         if ( cmp > ZERO ) {
  154.             Tapetime       = Tape[c] ;            /*  テープ標準時間        */
  155.             Sidetime.min   = Tapetime / 2 ;        /*  録音可能片面時間    */
  156.             Sidetime.sec   = Tapeperm[c] ;
  157.             Sidetime.frame = ZERO ;
  158.             /*  テープ時間が奇数の時    */
  159.             if ( Tapetime % 2 ) Sidetime.sec += 30 ;
  160.             while ( TRUE ) {
  161.                 if ( Sidetime.sec >= 60 ) {
  162.                     Sidetime.sec -= 60 ;
  163.                     Sidetime.min ++ ;
  164.                 } else {
  165.                     break ;
  166.                 }
  167.             }
  168.             break ;
  169.         }
  170.     }
  171.  
  172.     Flg.tape = TRUE ;
  173.     return( TRUE ) ;
  174. }
  175.  
  176. /****************************  プログラム登録曲自動選択  ************************/
  177. int TAPE_musicselect( void )
  178. /*=============================================================================
  179. **    録音可能テープに対し曲の振り分けを行う.
  180. **
  181. **    < INPUT  > : なし
  182. **    < OUTPUT > : なし
  183. **    < RETURN > : 曲の振り分けができた時には、真値, できなければ、偽値.
  184. =============================================================================*/
  185. {
  186.     int        c, cmp ;
  187.  
  188.     if ( Playmode != SW_PROGRAM )
  189.         return( FALSE ) ;                        /*  プログラム演奏モードでない    */
  190.     if ( CDDA_TOTAL_program ) return( FALSE ) ;    /*  既にプログラム登録曲あり    */
  191.  
  192.     if ( !Flg.tape ) {
  193.         if ( !TAPE_tapeselect() ) return( FALSE ) ;    /*  テープ選択 NG!        */
  194.     }
  195.  
  196.     for ( c=CDDA_INFO_buf.start; c<=CDDA_INFO_buf.end; c++ ) {
  197.         if ( !CDDA_data_check( c ) ) {                    /*  CD-DA ならば    */
  198.             /*    ●● 曲番号 ON ●●    */
  199.             if ( !CDDA_switch( c ) ) {                    /*  登録 OK!        */
  200. /*-----------------------------------------------------------------------------
  201. **    プログラム曲の登録時には、時間表示は、TM_TR_CLOCK とする.
  202. **    また、CHECK時同様プログラム曲確認中表示である旨を フラグセット する.
  203. **    曲の登録作業は、checkmusic() で行う.
  204. -----------------------------------------------------------------------------*/
  205.                 cmp = CDDA_cmptime( CDDA_TIME_program.min,
  206.                             CDDA_TIME_program.sec,
  207.                             CDDA_TIME_program.frame,
  208.                             Sidetime.min,Sidetime.sec,Sidetime.frame ) ;
  209.                 if ( cmp > ZERO ) {                        /*  片面時間オーバー    */
  210.                     CDDA_switch( CDDA_SW_PRG_CLEAR ) ;
  211.                 } else {
  212.                     Timemode   = TM_TR_CLOCK ;
  213.                     Flg.prgchk = TRUE ;
  214.                     checkmusic( c ) ;
  215.                     disptime( c,Timemode ) ;
  216.                     dispprogramtime() ;
  217.                 }
  218.             }    /*  登録 OK の時    */
  219.         }    /*  音楽曲の時    */
  220.     }    /*  for loop    */
  221.     return( TRUE ) ;
  222. }
  223.  
  224. /*****************************  選択テープの確認  ******************************/
  225. int TAPE_check( void )
  226. /*=============================================================================
  227. **    録音可能テープの確認を行う.
  228. **
  229. **    < INPUT  > : なし
  230. **    < OUTPUT > : なし
  231. **    < RETURN > : テープの変更ありならば、真値, なしならば、偽値.
  232. **
  233. **    プログラム演奏モード時に、テープ選択がされている時だけ処理を行う.
  234. =============================================================================*/
  235. {
  236.     int        c, cmp ;
  237.     char    sidea ;
  238.     int        tape ;
  239.  
  240.     if ( Playmode != SW_PROGRAM )
  241.         return( FALSE ) ;                        /*  プログラム演奏モードでない    */
  242.     if ( !Flg.tape ) return( FALSE ) ;            /*  テープ選択がされていない    */
  243.  
  244.     if ( !CDDA_TOTAL_program ) {
  245.         if ( !TAPE_musicselect() ) return( FALSE ) ;    /*  曲選択 NG!        */
  246.     }
  247.  
  248.     tape = Tapetime ;
  249. /*-----------------------------------------------------------------------------
  250. **    テープ変更の必要ありかどうかチェックする.
  251. -----------------------------------------------------------------------------*/
  252.     cmp = CDDA_cmptime( CDDA_TIME_program.min,
  253.                 CDDA_TIME_program.sec,
  254.                 CDDA_TIME_program.frame,
  255.                 CDDA_TIME_program2.min,
  256.                 CDDA_TIME_program2.sec,
  257.                 CDDA_TIME_program2.frame ) ;
  258.     if ( cmp > ZERO ) {                                    /*  Side A > side B    */
  259.         sidea = TRUE ;
  260.     } else {
  261.         sidea = FALSE ;
  262.     }
  263.  
  264. /*-----------------------------------------------------------------------------
  265. **    テープ変更の必要あり.
  266. -----------------------------------------------------------------------------*/
  267.     Tapetime = ZERO ;
  268.     Sidetime.min = Sidetime.sec = Sidetime.frame = ZERO ;
  269.     for ( c=0; c<Ntape; c++ ) {
  270.         Tapetime       = Tape[c] ;
  271.         Sidetime.min   = Tapetime / 2 ;
  272.         Sidetime.sec   = Tapeperm[c] ;
  273.         Sidetime.frame = ZERO ;
  274.         /*  テープ時間が奇数の時    */
  275.         if ( Tapetime % 2 ) Sidetime.sec += 30 ;
  276.         while ( TRUE ) {
  277.             if ( Sidetime.sec >= 60 ) {
  278.                 Sidetime.sec -= 60 ;
  279.                 Sidetime.min ++ ;
  280.             } else {
  281.                 break ;
  282.             }
  283.         }
  284.  
  285.         if ( sidea ) {
  286.             cmp = CDDA_cmptime( Sidetime.min,Sidetime.sec,Sidetime.frame,
  287.                         CDDA_TIME_program.min,
  288.                         CDDA_TIME_program.sec,
  289.                         CDDA_TIME_program.frame ) ;
  290.         } else {
  291.             cmp = CDDA_cmptime( Sidetime.min,Sidetime.sec,Sidetime.frame,
  292.                         CDDA_TIME_program2.min,
  293.                         CDDA_TIME_program2.sec,
  294.                         CDDA_TIME_program2.frame ) ;
  295.         }
  296.         if ( cmp >= ZERO ) {                /*  Tape(片面) >= 選択片面    */
  297.             break ;
  298.         } else {
  299.             Tapetime = ZERO ;
  300.             Sidetime.min = Sidetime.sec = Sidetime.frame = ZERO ;
  301.         }
  302.     }
  303.     if ( Tapetime == ZERO ) return( FALSE ) ;
  304.  
  305.     if ( Tapetime == tape ) {                    /*  テープ変更 NG                */
  306.         return( FALSE ) ;
  307.     } else {                                    /*  テープ変更 OK!            */
  308.         return( TRUE ) ;
  309.     }
  310. }
  311.  
  312. /******************************  テープ自動選択  *******************************/
  313. void TAPE_autoselect( void )
  314. /*=============================================================================
  315. **    録音可能テープの選択および曲の振り分けを行う.
  316. **
  317. **    < INPUT  > : なし
  318. **    < OUTPUT > : なし
  319. **    < RETURN > : なし
  320. **
  321. **    テープ未選択時に限り、処理を行う.
  322. **    また、プログラム演奏モードで一曲も登録されていない時だけ自動選択を行う.
  323. =============================================================================*/
  324. {
  325.     if ( Playmode != SW_PROGRAM ) return ;        /*  プログラム演奏モードでない    */
  326.     if ( Flg.tape ) return ;                    /*  既にテープ選択済            */
  327.     if ( CDDA_NOW_status != CDDA_STAT_STOP )
  328.         return ;                                /*  停止中でない            */
  329.     if ( CDDA_TOTAL_program > ZERO ) return ;    /*  既にプログラム登録曲あり    */
  330.  
  331. /*-----------------------------------------------------------------------------
  332. **    テープ未選択時だけ
  333. -----------------------------------------------------------------------------*/
  334.     TAPE_tapeselect() ;
  335.     while ( TAPE_check() ) ;
  336. }
  337.  
  338.